<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2023 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below).  A copy of the license is included in the section entitled
"GNU Free Documentation License".

(a) The FSF's Front-Cover Text is:

A GNU Manual

(b) The FSF's Back-Cover Text is:

You have freedom to copy and modify this GNU Manual, like GNU
     software.  Copies published by the Free Software Foundation raise
     funds for GNU development. -->
<!-- Created by GNU Texinfo 6.5, http://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Control Flow (GNU Compiler Collection (GCC) Internals)</title>

<meta name="description" content="Control Flow (GNU Compiler Collection (GCC) Internals)">
<meta name="keywords" content="Control Flow (GNU Compiler Collection (GCC) Internals)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<link href="index.html#Top" rel="start" title="Top">
<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="index.html#Top" rel="up" title="Top">
<link href="Basic-Blocks.html#Basic-Blocks" rel="next" title="Basic Blocks">
<link href="Reading-RTL.html#Reading-RTL" rel="prev" title="Reading RTL">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.indentedblock {margin-right: 0em}
blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smalllisp {margin-left: 3.2em}
kbd {font-style: oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nolinebreak {white-space: nowrap}
span.roman {font-family: initial; font-weight: normal}
span.sansserif {font-family: sans-serif; font-weight: normal}
ul.no-bullet {list-style: none}
-->
</style>


</head>

<body lang="en">
<a name="Control-Flow"></a>
<div class="header">
<p>
Next: <a href="Loop-Analysis-and-Representation.html#Loop-Analysis-and-Representation" accesskey="n" rel="next">Loop Analysis and Representation</a>, Previous: <a href="RTL.html#RTL" accesskey="p" rel="prev">RTL</a>, Up: <a href="index.html#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Control-Flow-Graph"></a>
<h2 class="chapter">15 Control Flow Graph</h2>
<a name="index-CFG_002c-Control-Flow-Graph"></a>
<a name="index-basic_002dblock_002eh"></a>

<p>A control flow graph (CFG) is a data structure built on top of the
intermediate code representation (the RTL or <code>GIMPLE</code> instruction
stream) abstracting the control flow behavior of a function that is
being compiled.  The CFG is a directed graph where the vertices
represent basic blocks and edges represent possible transfer of
control flow from one basic block to another.  The data structures
used to represent the control flow graph are defined in
<samp>basic-block.h</samp>.
</p>
<p>In GCC, the representation of control flow is maintained throughout
the compilation process, from constructing the CFG early in 
<code>pass_build_cfg</code> to <code>pass_free_cfg</code> (see <samp>passes.def</samp>).
The CFG takes various different modes and may undergo extensive
manipulations, but the graph is always valid between its construction
and its release.  This way, transfer of information such as data flow,
a measured profile, or the loop tree, can be propagated through the
passes pipeline, and even from <code>GIMPLE</code> to <code>RTL</code>.
</p>
<p>Often the CFG may be better viewed as integral part of instruction
chain, than structure built on the top of it.  Updating the compiler&rsquo;s
intermediate representation for instructions cannot be easily done
without proper maintenance of the CFG simultaneously.
</p>
<table class="menu" border="0" cellspacing="0">
<tr><td align="left" valign="top">&bull; <a href="Basic-Blocks.html#Basic-Blocks" accesskey="1">Basic Blocks</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">The definition and representation of basic blocks.
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="Edges.html#Edges" accesskey="2">Edges</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Types of edges and their representation.
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="Profile-information.html#Profile-information" accesskey="3">Profile information</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Representation of frequencies and probabilities.
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="Maintaining-the-CFG.html#Maintaining-the-CFG" accesskey="4">Maintaining the CFG</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Keeping the control flow graph and up to date.
</td></tr>
<tr><td align="left" valign="top">&bull; <a href="Liveness-information.html#Liveness-information" accesskey="5">Liveness information</a>:</td><td>&nbsp;&nbsp;</td><td align="left" valign="top">Using and maintaining liveness information.
</td></tr>
</table>


<hr>
<div class="header">
<p>
Next: <a href="Loop-Analysis-and-Representation.html#Loop-Analysis-and-Representation" accesskey="n" rel="next">Loop Analysis and Representation</a>, Previous: <a href="RTL.html#RTL" accesskey="p" rel="prev">RTL</a>, Up: <a href="index.html#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>
